library(tidyverse)
library(readr)
chic <- read_csv("ggplot2/ggModify/chicago-nmmaps.csv")

# ggplot2包有两个很好的函数，用于创建多面板图形，称为facets。
#   facet_wrap本质上创建了一个基于单个变量的图形带，
#   而facet_grid则生成了包含两个变量的网格。

# 1. 创建一个基于两个变量的多面版图：
#   在有两个变量的情况下，由facet_grid完成这项工作。变量的顺序决定了行数和列数。
chic <- chic %>%
  mutate(year = substr(date, 1, 4))
ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "orangered", alpha = 0.5) +
  labs(x = "Year", y = "Temperature (°F)") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  facet_grid(year ~ season)

# 2. 创建基于单个变量的多面版图
#   Facet_wrap创建单个变量的面版图，前面用波浪线写:Facet_wrap (~ variable)。
#   图的呈现可由参数ncol和nrow控制。
g <- 
  ggplot(chic, aes(x = date, y = temp)) +
    geom_point(color = "chartreuse4", alpha = .3) +
    labs(x = "Year", y = "Temperature (°F)") +
    theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

g + facet_wrap(~ year)

# 你可以按照自己的喜好来排列这些图，比如将它们排成一行。
g + facet_wrap(~ year, nrow = 1)

# 甚至调整成一个不对称的网格图：
g + facet_wrap(~ year, ncol = 3) + 
  theme(axis.title.x = element_text(hjust = .15))


# 3. 允许坐标轴（Axes）自由漫步：
#   在ggplot2中，多面板图的默认值是在每个面板中使用同样的刻度（scale）。
#   但有时你希望允许一个面板自己的数据来决定scale。
#   通常不这么做，因为它可能会让用户对数据产生错误的印象。
#   但有时它确实很有用，你可以设置scales = "free":
g + facet_wrap(~ year, nrow = 2, scales = "free")

# facet_wrap（）也可用于2个变量的情况：
g + facet_wrap(year ~ season, nrow = 4, scales = "free_x")

# 当使用facet_wrap时，你仍能够控制网格设计:重新定义每行和每列的图形数量，
# 你也可以让所有轴的刻度自由定义。
# 相反，facet_grid也将接受一个free参数，但只会让它在每列或每行中自由定义，而不是针对每个面板:
g + facet_grid(year ~ season, scales ="free_x")


# 4. 修改条带文本的风格
#   通过使用主题，你可以修改条带文本的外观(即每个facet的标题)和条带文本框:
g + facet_wrap(~ year, nrow = 1, scales = "free_x") +
  theme(strip.text = element_text(face = "bold", color = "chartreuse4",
                                  hjust = 0, size = 20),
        strip.background = element_rect(fill = "chartreuse3", linetype = "dotted"))
